package com.example.study2.ThisReference;

/**
 * this引用特性演示
 * 展示this的各种特性和使用场景
 */
public class Date3 {
    // 成员变量
    public int year;
    public int month;
    public int day;

    /**
     * 构造方法 - 使用this区分成员变量和参数
     */
    public Date3(int year, int month, int day) {
        // 使用this引用成员变量
        this.year = year;
        this.month = month;
        this.day = day;
    }

    /**
     * 设置日期的方法
     * 编译器会自动添加一个隐藏的Date this参数
     * 实际方法签名：setDay(Date this, int year, int month, int day)
     */
    public void setDay(int year, int month, int day) {
        // 这里的this就是编译器自动传递的当前对象引用
        this.year = year;   // this.year访问成员变量，year访问参数
        this.month = month;
        this.day = day;
    }

    /**
     * 打印日期的方法
     * 编译器会自动添加一个隐藏的Date this参数
     * 实际方法签名：printDate(Date this)
     */
    public void printDate() {
        // 使用this引用访问成员变量
        System.out.println(this.year + "/" + this.month + "/" + this.day);
    }

    /**
     * 返回当前对象引用的方法
     * 用于演示this可以作为返回值
     */
    public Date3 getCurrentObject() {
        return this;  // 返回当前对象的引用
    }

    /**
     * 比较两个Date对象是否相等的方法
     * 使用this与另一个对象比较
     */
    public boolean isEqual(Date3 other) {
        // 使用this明确表示当前对象的成员变量
        return this.year == other.year &&
                this.month == other.month &&
                this.day == other.day;
    }

    /**
     * 静态方法示例 - 这里不能使用this
     */
    public static void staticMethod() {
        // 下面这行代码如果取消注释会编译错误
        // System.out.println(this.year); // 错误：不能在静态上下文中使用this
    }

    public static void main(String[] args) {
        // ==================== 创建对象 ====================
        // 创建d1对象，通过构造方法初始化为2020/9/15
        Date3 d1 = new Date3(2020, 9, 15);
        // 编译器实际调用构造方法：new Date(2020, 9, 15)
        // 此时d1的状态：year=2020, month=9, day=15

        // 创建d2对象，同样初始化为2020/9/15
        Date3 d2 = new Date3(2020, 9, 15);
        // 此时d2的状态：year=2020, month=9, day=15

        // ==================== 修改对象 ====================
        // 调用setDay方法修改d1的日期为2021/10/20
        d1.setDay(2021, 10, 20);
        // 编译器实际调用：setDay(d1, 2021, 10, 20)
        // 此时d1的状态变为：year=2021, month=10, day=20

        // ==================== 验证结果 ====================
        // 打印修改后的d1
        d1.printDate();  // 输出：2021/10/20
        // 编译器实际调用：printDate(d1)

        // 使用this作为返回值获取d1的引用
        Date3 current = d1.getCurrentObject();
        current.printDate();  // 输出：2021/10/20

        // 比较d1(2021/10/20)和d2(2020/9/15)是否相等
        System.out.println("d1和d2是否相等: " + d1.isEqual(d2));
        // 输出：false（因为2021/10/20 ≠ 2020/9/15）
    }
}